跳到主要内容

外键约束

约束的作用,是用于保证 数据的完整性或者合理性的工具!

外键 :foreign key,当前表内,指向其他表的主键的字段,称之为外键!

![](CB6353BF0C42BAECDEC5BA076D6E30E0.png)

外键约束:用于限制相关联的记录在逻辑上保证合理性的约束称之为外键约束!

约束,不是字段。

建立班级表

![](A9B10BC7C0BBB82E1E44CB7F44CA04C8.png)

再创建学生表

![](1A9FA20E31AC82A54F3365B5CD482110.png)

看看删除班级的情况:

![](8D6A3C5EF2F36A93266FD01C9A5C97B6.png)

出现了不合理数据:

此时,可以通过增加 外键约束 的方式,来限制以上的操作!

增加外键
----

alter table 表名 add constraint 约束的名字 foreign key 外键索引名字 (外键字段名) references 关联表名 (关联字段) [操作]

![](B7F244B8248D21FFBEAC830934760653.png)

再删除个试试:

![](B5906E1DE7D2AEDCC5E064A22BD0D2F9.png)

注意:如果当前的数据,已经不符合所见约束关联,则创建失败!

删除外键
----

alter table table\_name drop foreign\_key 外键名字!

可以通过 show create table 查看 约束的名字:

![](7DBB452310B2A333E14E59C25F0E295F.png)

注意,外键约束与索引的关系:

如果需要在某个字段上,增加外键约束,那么需要该字段也同样有索引!如果该字段上,没有索引,此时,mysql会自动在该字段上增加一个普通索引!

![](1847114AF9D33DE606AE4BD48174CA55.png)

可以选择指定外键约束的名字:

![](BE2BD662D6E65753DFF69F360482C3C8.png)

![](E0F44F2EB8CB546B57D01C49F8B49599.png)

注意上面的 外键约束自动建立的索引的名字,与 外键的名字相同!

总结:在创建时:

1, 外键 与 相应关联表的主键类型

2, 已有数据,必须满足约束条件才可以!

3, 可以使用 constraint 关键字,为外键约束起名字!

约束操作
----

在 对 父表(被关联的表)做操作时,有三种行为:

1, 严格限制,拒绝操作。restrict

2, 置 null,set null

3, 级联操作,cascade

以上三个行为操作,会在 主表记录被 删除 或者 更新时被使用!

on delete set null

on update cascade

![](5871997E81C45CF8852BC9A8BF7EECAE.png)

![](01C8DC95B2D63820826A1A51A68C3F19.png)

更新时的级联操作:

只有在 关联表的主键发生变化时,才会影响到从表的关联字段的变化!

![](EEF68775D9C0C62D3A91229701B9CCEB.png)

主表:被关联的

从表:发出关联的!

应该注意的问题:

关于,外键约束,只能在 当前的 mysql的的 innodb 表类型(引擎)下才会生效!

![](F94D9EE66CDFC6090B1C6D0D2F32FDF2.png)

外键,站在 php程序的角度,用到的不多!

数据操作,DML,DATA Management Language